/**
 * project: finance-manage
 * package: com.example.controllers
 * 逻辑处理 > 数据操作
 */

package com.example.controllers;

import com.example.dataAccess.DataDAO;
import com.example.interfaces.DataControlInterface;
import com.example.models.BillDataModel;
import com.example.models.JsonModel;
import com.example.util.Debug;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class DataControl extends Control_Base implements DataControlInterface {

    /* 数据库数据管理类 */
    private DataDAO dataDao = null;

    public DataControl() {
        /* 实例化数据库数据管理类 */
        dataDao = new DataDAO(connect.getConnection());
    }

    /* 添加账单数据 */
    @Override
    public JsonModel appendBillData(String username, String personalIdentificationCode, BillDataModel bill) {
        /* 验证用户身份 */
        if (!verifyUser(username, personalIdentificationCode)) {
            Debug.print("用户身份验证失败");
            return getErrno(1004);
        }
        /* 定义JsonModel类，用于返回结果 */
        JsonModel responseJsonModel;
        /* 向数据库插入账单数据 */
        try {
            dataDao.insert(username, bill.getType(), bill.getAmount(), bill.getDate(), bill.getStatement(),
                    bill.getNotes());
            responseJsonModel = getErrno(0);
        } catch (Exception e) {
            e.printStackTrace();
            responseJsonModel = getErrno(-998);
        }
        return responseJsonModel;
    }

    /* 查询账单数据 */
    @Override
    public JsonModel getBillsData(String username, String personalIdentificationCode, int count) {
        /* 验证用户身份 */
        if (!verifyUser(username, personalIdentificationCode)) {
            Debug.print("用户身份验证失败");
            return getErrno(1004);
        }
        /* 定义JsonModel类，用于返回结果 */
        JsonModel responseJsonModel;
        /* 当count为0时，不限制条数 读取全部 */
        boolean isCountZero = count == 0;
        /* 向数据库查询账单数据 */
        try {
            ResultSet resultSet;
            if (isCountZero) {
                resultSet = dataDao.select(username);
            } else {
                resultSet = dataDao.select(username, count);
            }
            /* 构造账单 Json 数据列表 */
            List<JsonModel> bills = new ArrayList<>();
            /* 遍历resultSet，构造账单数据 */
            while (resultSet.next()) {
                /* 构造账单数据对象 */
                BillDataModel bill = new BillDataModel();
                /* 设置账单数据属性 */
                bill.setBid(resultSet.getInt(1));
                bill.setType(resultSet.getString(2));
                bill.setAmount(resultSet.getDouble(3));
                bill.setDate(resultSet.getString(4));
                bill.setStatement(resultSet.getString(5));
                bill.setNotes(resultSet.getString(6));
                /* 向账单数据数组中添加账单json数据对象 */
                bills.add(new JsonModel(bill));
            }
            /* 关闭Statement和Statement对象 */
            resultSet.close();

            responseJsonModel = getErrno(0);
            responseJsonModel.push("data", bills);

        } catch (SQLException e) {
            e.printStackTrace();
            responseJsonModel = getErrno(-998);
        }
        return responseJsonModel;
    }

    /* 删除账单数据 */
    @Override
    public JsonModel deleteBillData(String username, String personalIdentificationCode, int bid) {
        /* 验证用户身份 */
        if (!verifyUser(username, personalIdentificationCode)) {
            Debug.print("用户身份验证失败");
            return getErrno(1004);
        }
        /* 定义JsonModel类，用于返回结果 */
        JsonModel responseJsonModel;
        /* 向数据库删除账单数据 */
        try {
            dataDao.delete(username, bid);
            responseJsonModel = getErrno(0);
        } catch (SQLException e) {
            e.printStackTrace();
            responseJsonModel = getErrno(-998);
        }
        return responseJsonModel;
    }

    /* 修改账单数据 */
    @Override
    public JsonModel updateBillData(String username, String personalIdentificationCode, BillDataModel bill) {
        /* 验证用户身份 */
        if (!verifyUser(username, personalIdentificationCode)) {
            Debug.print("用户身份验证失败");
            return getErrno(1004);
        }
        /* 定义JsonModel类，用于返回结果 */
        JsonModel responseJsonModel;
        /* 向数据库修改账单数据 */
        try {
            int bid = bill.getBid();
            dataDao.update(username, bid, "type", bill.getType());
            dataDao.update(username, bid, "amount", bill.getAmount());
            dataDao.update(username, bid, "date", bill.getDate());
            dataDao.update(username, bid, "statement", bill.getStatement());
            dataDao.update(username, bid, "notes", bill.getNotes());
            responseJsonModel = getErrno(0);
        } catch (SQLException e) {
            e.printStackTrace();
            responseJsonModel = getErrno(-998);
        }
        return responseJsonModel;
    }

    /* 获取用户哈希值 */
    @Override
    protected String getHashPwd(String username) {
        AccountControl accountControl = new AccountControl();
        String hasPwd = accountControl.getHashPwd(username);
        accountControl.close();
        return hasPwd;
    }

    @Override
    public void close() {
        try {
            dataDao.close();
        } catch (SQLException e) {
            e.printStackTrace();
            Debug.print("未知错误， 发生于connection关闭时");
        }
    }
}
